const myEvent = {
  // 缓存列表 存放订阅者回调函数
  list:{},

  // 增加订阅者
  on:function(key,fn){

    // 如果还没有订阅过此类消息，给该类消息创建一个缓存列表
    if(!this.list[key]) {
      this.list[key] = [];
    }
     // 订阅消息添加到缓存列表
    this.list[key].push(fn);

    
  },
  //发布消息
  emit:function(){
    
      var key = Array.prototype.shift.call(arguments)
        var   fns = this.list[key]; // 取出该消息对应的回调函数的集合
         
      // 如果没有订阅过该消息的话，则返回  
      if(!fns || fns.length === 0) {
          return false;
      }
      // for 循环调用回调函数
      for(var i = 0, fn; fn = fns[i++];) {
          fn.apply(this,arguments);
      }
  },
  remove: function(key,fn){
   
      var fns = this.list[key];
      // 如果key对应的消息没有订阅过的话，则返回
      if(!fns) {
          return false;
      }
      // 如果没有传入具体的回调函数，表示需要取消key对应消息的所有订阅
      if(!fn) {
          fns && (fns.length = 0);
      }else {
          for(var i = fns.length - 1; i >= 0; i--){
              var _fn = fns[i];
              if(_fn === fn) {
                  fns.splice(i,1);// 删除订阅者的回调函数
              }
          }
      }
  }
  
}

myEvent.on('add',function(count){
  console.log('add listen is called,args is '+count)
});

var showFun = function(){
  console.log('show listen is called')
}

myEvent.on('show',showFun);

var count = 0;
myEvent.emit("add",count++);
myEvent.emit("add",count++);


myEvent.remove('show',showFun)

myEvent.emit('show',count)